<?php

class CidadeMapper extends SON_Db_DataMapperAbstract
{
    protected $_dbTable = "DbTable_Cidade";
    protected $_model = "Cidade";

    protected function _insert(SON_Db_DomainObjectAbstract $obj)
    {
        try {
            $dbTable = $this->getDbTable();
            $data = array(
                'nome' => $obj->getNome(),
                'codigo' => $obj->getCodigo(),
                'estado_id' => $obj->getEstado_id()
            );
            return $dbTable->insert($data);
        } catch (Zend_Exception $e) {
            throw new Exception($e);
        }
    }

    protected function _update(SON_Db_DomainObjectAbstract $obj)
    {
        try {
            $dbTable = $this->getDbTable();
            $data = array(
                'nome' => $obj->getNome(),
            	'codigo' => $obj->getCodigo(),
                'estado_id' => $obj->getEstado_id()
            );
            $data = array_map(function($value) { return (!is_null($value) && empty($value)) ? new Zend_Db_Expr('NULL') : $value; }, $data);
            $dbTable->update(array_filter($data), array('id = ?' => $obj->getId()));
            return true;
        } catch (Zend_Exception $e) {
            throw new Exception($e);
        }
    }
    
    public function search(array $params = null)
    {
    	$page = isset($params['page']) ? (int) $params['page'] : 1;
    	$conditions = isset($params['conditions']) ? $params['conditions'] : null;
    	$perPage = isset($params['perpage']) ? (int) $params['perpage'] : 20;
    	$limit = ( $page - 1 ) * $perPage;
    	$select = $this->getDb()->select();
    
    	$select->from('cidade', array('id', 'nome'))
		    	->join('estado', 'estado.id = cidade.estado_id', array('estado' => 'sigla'));
    
    	if (is_array($conditions)) {
    		foreach ($conditions as $key => $condition) {
    			$select->where($key, $condition);
    		}
    	}
    
    	if (!is_null($limit) || $limit != 0)
    		$select->limit($perPage, $limit);
    
    	$paginator = Zend_Paginator::factory($select);
    	$paginator->setCurrentPageNumber($page);
    	$paginator->setItemCountPerPage($perPage);
    
    	return $paginator;
    }
    
    public function fetchPairs()
    {
    	$select = $this->getDb()->select()->from('cidade', array('id', 'nome'));
    	return $this->getDb()->fetchPairs($select);
    }
    
    public function find($id)
    {
    	$db = $this->getDb();
    	$query = $db->select();
    	$query->from('cidade')
    		->where('id = ' . (int) $id);
    
    	$data = $db->fetchRow($query);
    
    	if ($data) {
    		$estado = new Estado();
    		$restado = $estado->find($data['estado_id']);
    		$data['estado_id'] = $restado;
    
    		return $this->_populate($data);
    	}
    }
    
    public function findByNome($nome, $estado_id)
    {
    	$db = $this->getDb();
    	$query = $db->select();
    	$query->from('cidade')
    		->where('nome = ?', $nome)
    		->where('estado_id = ?', $estado_id);
    
    	$data = $db->fetchRow($query);
    	if ($data) {
    		return $this->_populate($data);
    	}
    }
}

